#ifndef __GCCGRAPH_
#define __GCCGRAPH_

#include <vector>
#include <assert.h>

using namespace std;

typedef unsigned char uchar;

class Vtx //结点类
{
public:
    //在maxflow算法中用于构建先进-先出队列
    Vtx *next;
    int parent;
    //首个相邻边
    int first;
    //时间戳
    int ts;
    //到树根的距离
    int dist;
    double weight;
    //图中结点的标签，取值0或1，0为源节点（前景点），1为汇节点（背景点）
    uchar t;
};

class Edge //边类
{
public:
    int dst;       //边指向的结点
    int next;      //该边的顶点的下一条边
    double weight; //边的权重
};

class GCGraph
{
public:
    GCGraph();
    GCGraph(unsigned int vtxCount, unsigned int edgeCount);
    ~GCGraph();
    //给图的结点容器和边容器分配内存
    void create(unsigned int vtxCount, unsigned int edgeCount);
    //添加空结点
    int addVtx();
    //添加点之间的边n-link
    void addEdges(int i, int j, double w, double revw);
    //添加结点到顶点的边t-link
    void addTermWeights(int i, double sourceW, double sinkW);
    //最大流函数
    double maxFlow();
    //图对象调用最大流函数后，判断结点属不属于属于源点类（前景）
    bool inSourceSegment(int i);

private:
    std::vector<Vtx> vtcs;   //存放所有的结点
    std::vector<Edge> edges; //存放所有的边
    double flow;             //图的流量
};



#endif
